查看原文
其他

做对话机器人的各家企业,都在关注哪些问题

吴金龙 AINLP 2020-10-22

作者:吴金龙,爱因互动技术合伙人,算法负责人

知乎专栏:智能对话机器人技术


原文链接,可点击文末"阅读原文"直达:

https://zhuanlan.zhihu.com/p/97176749




AICon 2019上有很多来自企业界介绍对话机器人/NLP的talks,本文简单总结下,希望对其他人有帮助。文中的大部分图片来自会议PPT,感兴趣可以去 会议主页 下载。实在不方便下载的同学,可以评论留言给我。

内容比较长,讲到的talks按顺序分别来自:追一、百分点、微软小冰、小米、滴滴、华为和百度。内容依据个人喜好有删减。

先给出一个简单总结,不限于本文涉及talks中的观点。

总结

对话机器人的几个大方向:

  • 语义理解更强:Bertology

  • 模型要求更少数据,更鲁棒:迁移学习/模型预训练、数据增强、对抗训练

  • 模型更低耗:迁移、蒸馏、压缩

  • 多模态数据使用

  • 多轮对话:session-based dialogue

  • 更个性化的回复,如回复符合对方的身份特征,符合当前场景的情绪等

  • 融合额外信息:对话历史、背景、common sense等


企业服务中智能交互机器人的实践与探索,徐易楠,追一科技 高级算法研究员

说的以下4个点还挺有实战意义的:


01 冷启动、可复制能力不够

冷启动主要指两个问题:

  • 新意图的冷启动

  • 新数据集的冷启动

所谓的可复制能力,是指把在一个项目中构建的能力,复制到其他项目中去。

数据复用

如何复用数据?主要通过无监督数据增强方法,其中又包括构造伪标签构建相似样本两种方法。

a) 构造伪标签

利用已有模型或者规则为非标注数据打标签(Weak Label),然后把这些Weak Label数据加入到训练过程。在原始CE Loss的基础上,会加入Weak Loss (通常就是预测与Weak Label之间的CE)。


本质上这就是半监督模型的思路。

对无标签数据打标签的模型,不需要是原模型,可以是更复杂更准确的模型。

b) 构造相似样本

利用一些方式,如规则、同义词替换、seq2seq生成等方法,基于非标注数据构造他们的相似样本。然后在损失函数中加入对未标注数据的预测分布和对它们相似样本的预测分布的KL距离:KL(pred dist for unlabelled sample, pred dist for unlabelled augumented sample)


本质上这就是让模型看到更多数据,并要求模型对相似样本给出相似预测以提升模型的稳定性

c) 借鉴主动学习(类似 DPF 的思路)

主动学习是说有了一个基本模型后,利用它去预测未标注数据,然后从预测结果中找出不确定性高的样本,由人工去标注。之后把这些标注后的数据加入到训练数据中重新训练模型,如此迭代不断改进模型效果。


但上面的流程显然还是需要人工介入做标注。那能不能把上面人工标注的过程改成由模型来标注呢?

作者的思路是直接用当前模型代替人工来筛选数据加入到训练数据中重新训练。但此时只能加入模型比较确定的那些数据,比如预测值>0.8。思路其实和我很早时说的 DPF 是一模一样的,具体见:

数据挖掘中常用的数据清洗方法有哪些?www.zhihu.com


利用模型对未标注数据打上弱标签,然后通过弱损失(Weak Loss)把它们加入到训练过程,训练新的模型。然后再对未标注数据打标签,如此重复。


选择样本的模型可以是teacher模型,也就是更复杂更准确的模型。而我们最终获得的模型是student模型。

效果上看,不论未标注数据是否有噪声(有可能是主动加入的噪声,以提升模型鲁棒性?),最终模型都会有 1~2%的精度提升。


模型复用

把在某个项目中训练好的模型,直接复用到新的项目中,即所谓的连续学习。通过引入新的编码器来扩充原有模型的学习能力,以便学习出新数据上的信息。


效果如下:


模型优化

少样本学习(即 few-shot learning),可解决新意图问题

  • 类别表达特征构建:把类别用embedding表示,这样方便表示新类别

  • 深度交叉Attention


效果:


02 系统鲁棒性不足

鲁棒性就是指的模型抗干扰能力。


0) 数据增强常用方法

一些常用的数据增强方法,能提升模型的鲁棒性。


值得注意的是,使⽤⽣成模型增强数据,据说他们用的还挺多的,而且被验证效果不错。生成模型应该就是常用的seq2seq+attention。以下是一个生成模型的示例:

生成的数据有可能和原始数据并不相似,可以通过模型对生成的数据进行过滤:把生成的数据放到分类模型中去预测,把预测为与原句同一类的句子加入训练集重新训练模型。

更算法一点的做法就是使用对抗训练了。

如何找到对抗样本?一般有以下几个方法/标准:

  • 最⼩化与原样本的距离,且能最⼤化分类结果差异性

  • 最⼩化扰动,且使对抗样本被预测至期望的标签

  • 真实标签梯度上升的方向

a) 监督样本产生对抗损失

对于NLP这种离散场景,一般是对embedding向量加一个小扰动,让加扰动后的损失上升最多,也即扰动方向是损失函数的梯度。其中的对抗损失(Adversarial Loss),应该就是加扰动后的embedding向量产生的模型输出应该和原embedding模型输出尽量一致。


b) 无监督样本产生虚拟对抗损失(Virtual-Adversarial Loss)

作者说下图是利用无监督样本产生虚拟对抗损失,但如果只是用无监督样本的话应该不会有图里的Supervised Loss。

先按图中流程猜测下使用无监督数据怎么用。左侧输入的是原始的无监督数据,然后在它的embedding上加上一个随机噪音(Random Noise),再走Encoder的过程得到V-Feature,然后与原始数据获得的预测分布计算KL散度。我们期望加了噪音后KL散度要越小越好。所以朝着KL散度的梯度可以得到KL值增加的方向,也即V-Gradient。之后把V-Gradient加到原始embedding中获得V-Adversarial embedding。之后就是通过原始数据获得的输出分布与V-Adversarial embedding获得的输出分布计算对抗损失(V-Adversarial Loss)。

整个过程其实没有用到Supervised Loss。本质上这么做是让模型更好地对抗随机噪音,提高稳定性。

这个过程当然也可以用在有监督数据上,差别可能只在计算V-Adversarial Loss时,原数据分布可以使用真实label。


c) 监督+无监督样本的对抗损失

当然,前面两个图中的方法是可以拼起来一起用的,即同时使用监督+无监督样本的对抗损失。得到下面的图:


以下是上面方法(没说具体哪个方法)的效果,会有一定提升,但可能不会特别明显。


03 ⼝语化表达理解能⼒不够

主要针对以下类型问题:


作者的尝试是语音 + 文本联合建模,能得到一定的提升。Attention的思路不错。只说了音素和文本encoding后做交叉attention,不确定所谓的Wav Encoder是具体怎么做的。


04 不能洞察⽤户情感, 从⽽进⾏安抚

大意就是说应该把多模态数据都用起来,这样效果会更好。

另一个好处是一个数据集训练好的模型,迁移到另一个数据集上的话能在使用更少数据的情况下获得更好的结果。迁移方式可以是利用前一个训练好的模型初始化新模型。


还提到使用双向解码器来生成带情感的回复,说是比单向效果好点。


双向解码器示意图如下,两个方向交叉的方式就是Attention。虽然图中显示L2R和R2L生成的文字刚好相反,但实际中应该是不做这个保证的,只是比较两个方向上最后生成的2 * topK个句子的概率值,取概率值最高的那个作为最终结果。生成时会用到Beam Search的双向版本。

更多说明可见 《seq2seq之双向解码》 这篇文章或者论文 《Synchronous Bidirectional Neural Machine Translation》。


双向解码器

最后,贴个作者的总结:

  • ⽆标签数据合理使⽤是有较⼤益处的;

  • 找到有效的对抗样本能提升机器⼈效果及鲁棒性;

  • 多模态建模能做到信息互补,能够提升效果及⽤户体验;

  • 情感计算能极⼤提升⽤户体验,值得关注。


深度迁移学习在NLP中的应用及实践,苏海波,百分点科技 首席算法科学家

迁移学习:模型预训练

据说是来自2016年Andrew Ng的一张图。


Google TPU的实践

TPU的速度是GPU的80倍。结论是租用Google的TPU,要比使用GPU便宜的多,1/10不到。坑是TPU可能要绑定Tensorflow使用。(目前还不支持PyTorch和MXNet?)




情感分类中的实践

短文本之前使用TextCNN,现在BERT效果更好,而且只要更少的数据。


长文本目前也在使用BERT这类模型:RoBERTa / XLNet / ERNIE + Post train。这类模型通常支持的最大文本长度是512个token,所以如果碰到更长的文本,一种简单的做法就是平均截断,然后再利用pooling或者序列方法如GRU合并每段上的句子向量表示。


相比于直接扔掉超过长度的文本,使用平均截断后效果会更好点。


作者也比较了使用Post-training技术的效果(不过注意F1那列的数据,和上张图中的一模一样,估计是typo吧)。所谓的Post-training,其实就是利用任务领域数据(可以是非标注数据)对BERT再做一些训练,训练目标依旧是BERT的MLM和NSP。具体可见论文 《BERT Post-Training for Review Reading Comprehension and Aspect-based Sentiment Analysis》。


智能问答中的实践

语义匹配模型BIMPM及其变种

BIMPM见这篇论文《Bilateral Multi-Perspective Matching for Natural Language Sentences》,示意图见下面。作者在三个地方对BIMPM做了改造。第一个是把底层的Word Representation Layer换成了BERT的词表示输出(可以组合使用BERT最上面几层的输出结果),第二个是把Context Representation Layer去掉了,既然底层已经把BERT加入进来了,第三个是把Aggregation Layer中的LSTM改成了Transformer。具体见下图右边文字介绍,以及对应的白色箭头和框。


数据增强

一般的数据增强方法见上面追一分享。作者这里的亮点是把匹配型对话机器人遇到的常见问题做了很好的归类,并给出了一些对应的数据增强方法以优化各个类型的问题,大赞实在。


针对T1.1~T1.3的数据增强:


针对T1.4的数据增强:


针对T1.5的数据增强:



可以删掉其中的ATT、ADV。(存在疑问,删掉ATT或者ADV语义未必不等价。)


针对T1.6的数据增强。替换其中的POB、VOB关系。比如从无监督数据中可以找出很多与“提起”有VOB关系的短语:“提起-->VOB-->***”,当发现当前句子有一个这种短语”提起-->VOB-->公益诉讼“,就可以把其中的”公益诉讼“替换成其他短语。


使用数据增强后,各类问题得到较大的优化。


增强分析中的实践

增强分析,即加入AI技术后的BI。

主要介绍了NL2SQL技术。NL2SQL的传统流程如下:


微软提出的 X-SQL 模型:


模型就是Encoder + Attention的逻辑,具体可见原论文。X-SQL把NL2SQL任务拆解成了6个子任务,这个拆解方法比较有意思。用下面的sql语句做个简单说明:

SELECT MAX(age) FROM profile WHERE name == '张三' and gender != '男'

第一个子任务 S-COL 确定 SQL 语句查询表的哪一列,也即上面示例中的 'age'。第二个子任务 S-AGG 确定对第一个子任务选出的列使用什么函数操作,也即示例中的 'MAX'。其余 4 个任务 W-NUM、W-COL、W-OP 和 W-VAL 一起决定了 SQL 语句的 WHERE 部分,其中 W-NUM 决定了对表的几个列进行约束(示例中为2),W-COl 表示对哪几列进行约束(示例中为'name'和'gender'),W-OP 表示对这几列的操作符,比如>、<、==、!=等等(示例中为'=='和'!='),W-VAL 表示对这几列进行约束的值(示例中为'张三'和'男')。

可见X-SQL没法直接表示很复杂的SQL语句,需要做一些扩展。可以参考 这里 。

百分点提出的考虑依存句法树的X-SQL新算法。


鉴于依存句法分析结果的不靠谱性(经验),个人不看好这种组合方式。作者的结论倒是很美好,我猜里面应该写了很多RE。


微软小冰:人格化对话机器人的构建 及在语音场景当中的实践,曾敏,微软高级技术总监

微软小冰涉及的具体技术可以参考我之前的这篇文章:

BreezeDeus:微软小冰对话机器人架构zhuanlan.zhihu.com

如何构建人格化的对话机器人

三类对话系统:

  1. 任务完成型,如查天气,订外卖

  2. 回答信息,如天空为什么是蓝色的,需要基于知识图谱作答

  3. 通用对话,小冰的切入点


对话可能是在不同场景下切换的,用户通常不会在某段时间内只做一件事情。使用CPS评价对话体验。小冰目前CPS做到23轮。


小冰架构。Understanding后会有两种Policy,一种是被动响应,另一种是主动出击。


Query Understanding

主要包括4个部分:

Frequent queries, also known as head queries, are easier to handle largely because their intents are evidenced by abundant click-through data (query logs).

Query Rewriting

具体看《Unsupervised Context Rewriting for Open Domain Conversation》这篇论文吧。


这篇论文里介绍的怎么产生训练数据的方式,还是很有意思的。下面简单介绍下。

先说明下这里的Query改写的背景:

  • 前n-1轮对话统称为背景context:c

  • 用户当前第n轮对话称为last utterance: q;q 即为待改写的query

  • 产生训练数据时是知道q对应的答复reponse的:r

过程主要分为三步:

  1. 利用逐点互信息PMI从c中找出与q和r互信息最高的若干个词;

  2. 对上步找出的每个词,选取以它为中心窗口大小为2的窗口(5个词),然后遍历这其中的可能片段,把这些片段插到待改写的q中,利用多层RNN语言模型计算插入后句子的概率值。最终保留分数最高的3个候选句子s*进入下一步的排序。

  3. 如果r是通过端到端的生成任务产生的,可以利用s生成r的概率对s进行排序;如果r是通过检索选择出来的,就可以利用s对r选择的正确性进行排序,能把好的r排在更高的位置的s,就是好的s*。

小样本学习

小冰要为不同的应用创建不同风格的机器人,不同的机器人会涉及到不同的意图。所以他们使用小样本学习来应对数据少的新意图。作者说他们已经可以做到三分钟就自动用小样本学习方法对新意图建模了。具体看列出的论文。


标准架构。L3会对答复做过滤,比如滤掉与对话背景不符(下午就不该说上午好),与机器人画像不符的结果。


用BERT+蒸馏方法获得更好的分类模型。


生产时把话题信息也加入进去。具体技术应该也有相关论文,有需要可以找找。


共感模型

使用模型(即dialog act prediction)判断对用户当前说的话,应该表达什么样的行为。是赞同、反驳、继续这个话题、引导到新话题等等。通过这个模块来控制对话节奏。后续生成回复时也会把dialog act用进去。也有具体论文。

https://arxiv.org/pdf/1807.07255.pdf Towards Explainable and Controllable Open Domain Dialogue Generation with Dialogue Acts



给机器人赋予人格,然后利用这种人格可以更好地达到某些目的,比如推荐。例如喜欢吃辣的机器人,推荐辣味产品更容易让人接受?嗯。。



NLP在小米的探索与实践,王斌,小米AI实验室主任、NLP首席科学家

文本分类

文本分类流程。里面有个针对badcase做定向增强的模块(图中白框),和百分点中的数据增强模块功能类似。


闲聊

闲聊也是用检索做的,只是库比较大,和小冰类似。


加了一个添加单个表情的模块,用6分类模型从五个常用的表情中选择一个或者不选。


离线机器翻译

使用知识蒸馏和Quantization压缩离线机器翻译模型。


把离线翻译模型适配到不同领域的流程。通过反向翻译技术获得领域翻译数据,然后利用低学习率微调已有的离线模型,再做Int8压缩。



滴滴搜索系统的深度学习演进之路,陈欢,滴滴出行 高级专家算法工程师

基于HMM和seq2seq模型的query rewriter


相关性模型

混合使用汉字与拼音。注入POI信息。




华为预训练语言模型技术与应用,魏俊秋,华为诺亚方舟实验室语音语义组

简单列一下介绍的两篇论文:中文预训练语言模型哪吒 NEZHA,和蒸馏模型 TinyBERT。

NEZHA

使用函数式相对位置编码:


训练任务改进:使用全词MASK和Span预测任务。



优化算法改进:


TinyBERT


一般的蒸馏过程是利用特定任务数据训练得到一个复杂的Teacher模型(比如把BERT在特定任务数据上做fine tuning),然后再蒸馏这个Teacher模型得到小的Student模型。TinyBERT使用了两阶段蒸馏框架。首先直接在通用语料上蒸馏BERT,得到通用的小模型TinyBERT,然后再利用特定任务数据fine tuning这个TinyBERT。跟DistilBERT流程相同吧。



蒸馏方式与一般方法不太一样,还会用到中间层的中间结果Attention Matrices进行蒸馏。具体看论文吧。



AI大生产时代下的NLP技术创新与应用实践,忻舟,百度 / 自然语言处理部副总监

只记得以下这个结论(不完全确定是否来自这个talk):

基于BERT蒸馏出TextCNN模型,最终效果也能好很多。




最后插播一个我们的招聘广告,爱因互动在招算法工程师(偏NLP、语音方向),欢迎对这些方向感兴趣的同学私信我或者直接投简历到 jobs@ein.plus 。我们也欢迎没有算法经验但对算法感兴趣的同学投简历。



推荐阅读

深度剖析知识增强语义表示模型——ERNIE

知识图谱存储与查询:自然语言记忆模块(NLM)

BERT论文笔记

XLNet 论文笔记

当BERT遇上知识图谱

Nvidia League Player:来呀比到天荒地老

征稿启示| 让更多的NLPer看到你的文章

我们建了一个免费的知识星球:AINLP芝麻街,欢迎来玩,期待一个高质量的NLP问答社区

关于AINLP


AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP君微信(id:AINLP2),备注工作/研究方向+加群目的。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存